home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995 June: Reference Library / Dev.CD Jun 95 / Dev.CD Jun 95.toast / What's New? / New System Software Extensions / QuickDraw 3D ß / Programming / SampleCode / Modeller ƒ / Modeller_PICTImport.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-26  |  4.8 KB  |  176 lines  |  [TEXT/MPS ]

  1. #include "Modeller_globals.h"
  2. #include "Modeller_prototypes.h"
  3. #include "QD3DShader.h"
  4. #include "QD3DStorage.h"
  5.  
  6. #include "Modeller_PICTImport.h"
  7.  
  8.  
  9. TQ3Boolean TextureFromPICT(
  10.     PicHandle             pict,
  11.     TQ3StoragePixmap     *bmap)
  12. {
  13.     unsigned long             *texture_map;
  14.     unsigned char             *texture_map_addr;
  15.     unsigned long             *pict_map;
  16.     unsigned long             pict_map_addr;
  17.     register unsigned long     row;
  18.     register unsigned long     col;
  19.     Rect                     rectGW;
  20.     GWorldPtr                 pGWorld;
  21.     PixMapHandle             hPixMap;
  22.     unsigned long             pict_rowbytes;
  23.     
  24.     GDHandle                oldGD;
  25.     GWorldPtr                oldGW;
  26.     
  27.     unsigned long            textureSize;
  28.     
  29.     /* save current port */
  30.     GetGWorld(&oldGW, &oldGD);
  31.  
  32.     rectGW = (*pict)->picFrame;
  33.     
  34.     /* create the GWorld */
  35.     NewGWorld(&pGWorld, 32, &rectGW, 0, 0, 0);
  36.     
  37.     if(pGWorld == nil) {
  38.         Alert(130, 0L);
  39.         return(kQ3False);
  40.     }
  41.  
  42.     hPixMap = GetGWorldPixMap(pGWorld);
  43.     pict_map_addr = (unsigned long) GetPixBaseAddr (hPixMap);
  44.     pict_rowbytes = (unsigned long)(**hPixMap).rowBytes & 0x3fff;
  45.     
  46.     /* put the PICT into the window */
  47.     SetGWorld(pGWorld, nil);
  48.     
  49.     LockPixels(hPixMap);
  50.     EraseRect(&rectGW);
  51.     DrawPicture(pict, &rectGW);
  52.         
  53.     /* allocate an area of memory for the texture */
  54.  
  55.     textureSize = (rectGW.right - rectGW.left) * (rectGW.bottom - rectGW.top) * sizeof(unsigned long);
  56.  
  57.     texture_map = (unsigned long *)NewPtr(textureSize);
  58.     if (texture_map == nil) {
  59.         Alert(130, 0L);
  60.         return(kQ3False);
  61.     }
  62.     
  63.     bmap->width = rectGW.right - rectGW.left;
  64.     bmap->height = rectGW.bottom - rectGW.top;
  65.     bmap->rowBytes = bmap->width * 4;
  66.     bmap->pixelSize = 32;
  67.     bmap->bitOrder = kQ3EndianBig ;
  68.     bmap->byteOrder = kQ3EndianBig ;
  69.  
  70.     /* copy the PICT into the texture */
  71.     texture_map_addr = (unsigned char *) texture_map;
  72.     for (row = 0L; row < bmap->height; row++) {
  73.         pict_map = (unsigned long *)(pict_map_addr + (pict_rowbytes * row));
  74.         for (col = 0L; col < bmap->width; col++) {
  75.             *texture_map++ = (*pict_map++|0xff000000L);
  76.         }
  77.     }
  78.     
  79.     bmap->image = Q3MemoryStorage_New(texture_map_addr, textureSize);
  80.  
  81.     UnlockPixels(hPixMap);
  82.     
  83.     /* restore port */
  84.     SetGWorld(oldGW, oldGD);
  85.     
  86.     /* free GWorld */
  87.     DisposeGWorld(pGWorld);
  88.     
  89.     DisposePtr((Ptr)texture_map_addr);
  90.     
  91.     return(kQ3True);
  92. }
  93.  
  94. TQ3Status AddTextureToDocument(DocumentPtr theDocument, TQ3StoragePixmap *textureImage)
  95. {
  96.     TQ3TextureObject    textureObject;
  97.     TQ3GroupPosition position;
  98.     TQ3Object        firstObject;
  99.     
  100.     textureObject = Q3PixmapTexture_New(textureImage);
  101.     
  102.     if( textureObject ) {
  103.         if( Q3Object_IsType(theDocument->documentGroup, kQ3GroupTypeDisplay) == kQ3True) {
  104.             Q3Group_GetFirstPosition(theDocument->documentGroup, &position);
  105.     
  106.             Q3Group_GetPositionObject(theDocument->documentGroup, position,    &firstObject);
  107.     
  108.             if( Q3Object_IsType(firstObject, kQ3SurfaceShaderTypeTexture) == kQ3True) {
  109.                 TQ3TextureObject    oldTextureObject;
  110.                 TQ3StoragePixmap oldTextureImage;
  111.                         
  112.                 Q3TextureShader_GetTexture(firstObject, &oldTextureObject);
  113.                 Q3PixmapTexture_GetPixmap(oldTextureObject, &oldTextureImage);
  114.                 
  115.                 Q3Object_Dispose(oldTextureObject);
  116.                 Q3TextureShader_SetTexture(firstObject, textureObject);
  117.                 Q3Object_Dispose(textureObject);
  118.             } else {
  119.                 TQ3ShaderObject textureShader;
  120.                 
  121.                 textureShader = Q3TextureShader_New(textureObject);
  122.                 Q3Object_Dispose(textureObject);
  123.                 //Q3Group_SetPositionObject(theDocument->documentGroup, position, theDocument->textureShader);
  124.                 Q3Group_AddObjectBefore(theDocument->documentGroup, position, textureShader);
  125.                 Q3Object_Dispose(textureShader);
  126.             }
  127.             
  128.             Q3Object_Dispose(firstObject);
  129.         } else if( Q3Object_IsType(theDocument->documentGroup, kQ3DisplayGroupTypeOrdered) == kQ3True) {
  130.             TQ3ShaderObject textureShader;
  131.             
  132.             Q3Group_GetFirstPositionOfType(
  133.                 theDocument->documentGroup,
  134.                 kQ3ShapeTypeShader, &position);    
  135.             
  136.             if( position ) {
  137.                 Q3Group_GetPositionObject(theDocument->documentGroup, position,    &firstObject);
  138.     
  139.                 if( Q3Object_IsType(firstObject, kQ3SurfaceShaderTypeTexture) == kQ3True) {
  140.                     TQ3TextureObject    oldTextureObject;
  141.                     TQ3StoragePixmap oldTextureImage;
  142.                     
  143.                     Q3TextureShader_GetTexture(firstObject, &oldTextureObject);
  144.                     Q3PixmapTexture_GetPixmap(oldTextureObject, &oldTextureImage);
  145.                     
  146.                     Q3Object_Dispose(oldTextureObject);
  147.                     Q3TextureShader_SetTexture(firstObject, textureObject);
  148.                     Q3Object_Dispose(textureObject);
  149.                 } else {
  150.                     textureShader = Q3TextureShader_New(textureObject);
  151.                     if( textureShader ) {
  152.                         Q3Object_Dispose(textureObject);
  153.                         Q3Group_SetPositionObject(theDocument->documentGroup, position, textureShader);
  154.                         Q3Object_Dispose(textureShader);
  155.                     } else {
  156.                         return(kQ3Failure);
  157.                     }
  158.                 }
  159.             } else {
  160.                 textureShader = Q3TextureShader_New(textureObject);
  161.                 if( textureShader ) {
  162.                     Q3Object_Dispose(textureObject);
  163.                     Q3Group_AddObject(theDocument->documentGroup, textureShader);
  164.                     Q3Object_Dispose(textureShader);
  165.                 } else {
  166.                     return(kQ3Failure);
  167.                 }
  168.             }
  169.             
  170.         }
  171.     return(kQ3Success);
  172.     } else {
  173.         return(kQ3Failure);
  174.     }
  175. }
  176.